home *** CD-ROM | disk | FTP | other *** search
/ Mac Magazin/MacEasy 19 / Mac Magazin and MacEasy Magazine CD - Issue 19.iso / Utilities / uae-0.4 / Source Code / autoconf.c next >
Text File  |  1996-02-13  |  4KB  |  213 lines

  1.  /* 
  2.   * UAE - The Un*x Amiga Emulator
  3.   * 
  4.   * AutoConfig devices
  5.   *
  6.   * (c) 1995 Bernd Schmidt
  7.   * (c) 1996 Ed Hanway
  8.   */
  9.  
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13.  
  14. #include "config.h"
  15. #include "amiga.h"
  16. #include "options.h"
  17. #include "events.h"
  18. #include "memory.h"
  19. #include "custom.h"
  20. #include "newcpu.h"
  21. #include "disk.h"
  22. #include "xwin.h"
  23. #include "autoconf.h"
  24. #include "filesys.h"
  25. #include "hardfile.h"
  26.  
  27. /* Commonly used autoconfig strings */
  28.  
  29. ULONG explibname;
  30.  
  31. /* ROM tag area memory access */
  32.  
  33. static UWORD rtarea[32768];
  34.  
  35. static ULONG rtarea_lget(CPTR) REGPARAM;
  36. static UWORD rtarea_wget(CPTR) REGPARAM;
  37. static UBYTE rtarea_bget(CPTR) REGPARAM;
  38. static void  rtarea_lput(CPTR, ULONG) REGPARAM;
  39. static void  rtarea_wput(CPTR, UWORD) REGPARAM;
  40. static void  rtarea_bput(CPTR, UBYTE) REGPARAM;
  41. static UWORD *rtarea_xlate(CPTR) REGPARAM;
  42.  
  43. addrbank rtarea_bank = {
  44.     rtarea_lget, rtarea_wget, rtarea_bget,
  45.     rtarea_lput, rtarea_wput, rtarea_bput,
  46.     rtarea_xlate, default_check
  47. };
  48.  
  49. UWORD *rtarea_xlate(CPTR addr)
  50. {
  51.     addr &= 0xFFFF;
  52.     return rtarea + (addr >> 1);
  53. }
  54.  
  55. ULONG rtarea_lget(CPTR addr)
  56. {
  57.     addr &= 0xFFFF;
  58.     return (ULONG)(rtarea_wget(addr) << 16) + rtarea_wget(addr+2);
  59. }
  60.  
  61. UWORD rtarea_wget(CPTR addr)
  62. {
  63.     addr &= 0xFFFF;
  64.     return rtarea[addr >> 1];
  65. }
  66.  
  67. UBYTE rtarea_bget(CPTR addr)
  68. {
  69.     UWORD data;
  70.     addr &= 0xFFFF;
  71.     data = rtarea[addr >> 1];
  72.     return addr & 1 ? data : data >> 8;
  73. }
  74.  
  75. void rtarea_lput(CPTR addr, ULONG value) { }
  76. void rtarea_bput(CPTR addr, UBYTE value) { }
  77.  
  78. /* Don't start at 0 -- can get bogus writes there. */
  79. static ULONG trap_base_addr = 0x00F00180; 
  80.  
  81. TrapFunction traps[256];
  82. static int max_trap = 0;
  83.  
  84. void rtarea_wput(CPTR addr, UWORD value) 
  85. {
  86.     /* Save all registers */
  87.     struct regstruct backup_regs = regs;
  88.     ULONG retval = 0;
  89.  
  90.     ULONG func = ((addr  - trap_base_addr) & 0xFFFF) >> 1;
  91.     if(func < max_trap) {
  92.     retval = (*traps[func])();
  93.     } else {
  94.     fprintf(stderr, "illegal emulator trap\n");
  95.     }
  96.     regs = backup_regs;
  97.     regs.d[0] = retval;
  98. }
  99.  
  100. /* some quick & dirty code to fill in the rt area and save me a lot of
  101.  * scratch paper
  102.  */
  103.  
  104. static int rt_addr = 0;
  105. static int rt_straddr = 0xF000/2 - 1;
  106.  
  107. ULONG
  108. addr(int ptr)
  109. {
  110.     return ((ULONG)ptr << 1) + 0x00F00000;
  111. }
  112.  
  113. void
  114. dw(UWORD data)
  115. {
  116.     rtarea[rt_addr++] = data;
  117. }
  118.  
  119. void
  120. dl(ULONG data)
  121. {
  122.     rtarea[rt_addr++] = data >> 16;
  123.     rtarea[rt_addr++] = data;
  124. }
  125.  
  126. /* store strings starting at the end of the rt area and working
  127.  * backward.  store pointer at current address
  128.  */
  129.  
  130. ULONG
  131. ds(char *str)
  132. {
  133.     UWORD data;
  134.     char c;
  135.     int start;
  136.  
  137.     int len = (strlen(str) + 1) >> 1;
  138.     rt_straddr -= len;
  139.     start = rt_straddr;
  140.     
  141.     do {
  142.     data = c = *str++;
  143.     if (c) {
  144.         data <<= 8;
  145.         c = *str++;
  146.         data |= c;
  147.     }
  148.     rtarea[start++] = data;
  149.     } while (c);
  150.     
  151.     return addr(rt_straddr--);
  152. }
  153.  
  154. void
  155. calltrap(ULONG n)
  156. {
  157.     dw(0x33C0);    /* MOVE.W D0,abs32 */
  158.     dl(n*2 + trap_base_addr);
  159. }
  160.  
  161. void
  162. org(ULONG a)
  163. {
  164.     rt_addr = (a - 0x00F00000) >> 1;
  165. }
  166.  
  167. ULONG
  168. here(void)
  169. {
  170.     return addr(rt_addr);
  171. }
  172.  
  173. int
  174. deftrap(TrapFunction func)
  175. {
  176.     int num = max_trap++;
  177.     traps[num] = func;
  178.     return num;
  179. }
  180.  
  181. void
  182. align(int b)
  183. {
  184.     rt_addr = (rt_addr + (b-1)) & ~(b-1);
  185. }
  186.  
  187. ULONG CallLib(CPTR base, WORD offset)
  188. {
  189.     /* Make tracing through this possible */
  190.     int oldspc = specialflags & SPCFLAG_BRK;
  191.     
  192.     CPTR olda6 = regs.a[6];
  193.     CPTR oldpc = m68k_getpc();
  194.     regs.a[6] = base;
  195.     regs.a[7] -= 4;
  196.     put_long (regs.a[7], 0xF0FFFE);
  197.     m68k_setpc (base + offset);
  198.     MC68000_skip (0xF0FFFE);
  199.     regs.a[6] = olda6;
  200.     m68k_setpc (oldpc);
  201.     specialflags |= oldspc;
  202.     return regs.d[0];
  203. }
  204.  
  205. void
  206. rtarea_init()
  207. {
  208.     explibname = ds("expansion.library");
  209.  
  210.     hardfile_install();
  211. //    filesys_install(); Not Implemented in Mac yet.
  212. }
  213.